import type { App } from 'vue'
// import { readonly } from 'vue';
import type { VxeGlobalConfig } from 'vxe-table'
import XEUtils from 'xe-utils'
import zhCN from 'vxe-table/es/locale/lang/zh-CN'
import {
  VxeUI,
  // VxeAlert,
  // VxeAnchor,
  // VxeAnchorLink,
  // VxeAvatar,
  // VxeBadge,
  // VxeBreadcrumb,
  // VxeBreadcrumbItem,
  VxeButton,
  // VxeButtonGroup,
  // VxeCalendar,
  // VxeCard,
  // VxeCarousel,
  // VxeCarouselItem,
  // VxeCheckbox,
  // VxeCheckboxGroup,
  // VxeCol,
  // VxeCollapse,
  // VxeCollapsePane,
  // VxeColorPicker,
  // VxeCountdown,
  // VxeDatePicker,
  // VxeDrawer,
  // VxeEmpty,
  // VxeForm,
  // VxeFormDesign,
  // VxeFormGather,
  // VxeFormGroup,
  // VxeFormItem,
  // VxeFormView,
  // VxeIcon,
  // VxeIconPicker,
  // VxeImage,
  // VxeImageGroup,
  // VxeImagePreview,
  // VxeInput,
  // VxeLayoutAside,
  // VxeLayoutBody,
  // VxeLayoutContainer,
  // VxeLayoutFooter,
  // VxeLayoutHeader,
  // VxeLink,
  // VxeListDesign,
  // VxeListView,
  VxeList,
  // VxeLoading,
  // VxeMenu,
  VxeModal,
  // VxeNoticeBar,
  VxeNumberInput,
  // VxeOptgroup,
  // VxeOption,
  VxePager,
  // VxePasswordInput,
  // VxePrintPageBreak,
  // VxePrint,
  // VxePulldown,
  VxeRadio,
  // VxeRadioButton,
  VxeRadioGroup,
  // VxeRate,
  // VxeResult,
  // VxeRow,
  // VxeSelect,
  // VxeSlider,
  // VxeSteps,
  // VxeSwitch,
  // VxeTabPane,
  // VxeTableSelect,
  // VxeTabs,
  // VxeTag,
  // VxeTextEllipsis,
  // VxeText,
  // VxeTextarea,
  // VxeTip,
  VxeTooltip
  // VxeTree,
  // VxeTreeSelect
  // VxeUpload,
  // VxeWatermark,
} from 'vxe-pc-ui'

// 使用basic-vxe-table
// import VxeGrid from '../basic-vxe-table'
import {
  // VxeTable,
  // VxeColumn,
  // VxeColgroup,
  // VxeGrid,
  VxeToolbar
} from 'vxe-table'
import VxeTable from 'vxe-table'

import { createTableSortMethod } from '../utils'
import VxeUIPluginRenderElement from '../lib/plugin-render-element'
import VXETablePluginShortcutKey from '../lib/vxe-table-plugin-shortcut-key'
import VXETablePluginExportXLSX from '../lib/vxe-table-plugin-export-xlsx'

const vxeGlobalConfig: VxeGlobalConfig = {
  // 按需加载的方式默认是不带国际化的，自定义国际化需要自行解析占位符 '{0}'，例如：
  i18n: (key, args) => XEUtils.toFormatString(XEUtils.get(zhCN, key), args),
  size: 'small', // 全局尺寸
  zIndex: 3000, // 全局 zIndex 起始值，如果项目的的 z-index 样式值过大时就需要跟随设置更大，避免被遮挡
  version: 1, // 版本号，对于某些带数据缓存的功能有用到，上升版本号可以用于重置数据
  table: {
    border: 'inner',
    stripe: true,
    autoResize: true,
    showHeaderOverflow: true,
    showOverflow: 'ellipsis',
    keepSource: false,
    showHeader: true,
    showFooterOverflow: true,
    tooltipConfig: {
      // enterable: false,
    },
    columnConfig: {
      useKey: true,
      isCurrent: false, // 列高亮
      resizable: true,
      minWidth: 120
    },
    rowConfig: {
      useKey: true,
      keyField: '_TABLE_ROW_KEY_',
      isCurrent: true,
      isHover: true
    },
    headerCellConfig: {
      // height: 46
      height: 38.88
    },
    cellConfig: {
      // height: 46
      height: 30
    },
    footerCellConfig: {
      // height: 46
      height: 30
    },
    resizableConfig: {
      minWidth: ({ column }) => {
        const resizableMinWidth = 60
        if (column.minWidth && (column.minWidth as number) < resizableMinWidth) {
          return column.minWidth
        } else {
          return resizableMinWidth
        }
      }
    },
    align: 'center', // 列居中
    // scrollY: {
    //   enabled: true, // 是否默认开启纵向虚拟滚动
    //   gt: 0 // 当数据大于指定数量时自动触发启用虚拟滚动
    // },
    // todo: 暂时注释,会影响合计行导出 2024-09-21 已修改源码解决
    // 会导致没有第一次渲染时formatter没有挂载,导致导出获取不到值
    // scrollX: {
    //   enabled: true, // 是否默认开启横向虚拟滚动
    //   gt: 0, // 当数据大于指定数量时自动触发启用虚拟滚动
    // },
    virtualXConfig: {
      enabled: true,
      gt: 0
    },
    virtualYConfig: {
      enabled: true,
      gt: 0
    },

    // 自定义列
    customConfig: {
      enabled: true,
      storage: {
        visible: true,
        resizable: true,
        sort: true,
        fixed: true
      },
      // mode: 'popup',
      mode: 'simple',
      allowSort: true,
      allowFixed: true,
      allowResizable: true,
      immediate: false,
      showFooter: true,
      modalOptions: {
        height: '80vh',
        width: '50vw'
      }
    },
    sortConfig: {
      // 全局排序有升序、降序两种，不需要组合排序
      remote: false,
      // multiple: true,
      // chronological: true,
      trigger: 'cell',
      orders: ['asc', 'desc'],
      sortMethod: createTableSortMethod()
    },
    exportConfig: {
      // filename: getExportName(),
      sheetName: '',
      type: 'xlsx',
      types: ['xlsx', 'csv', 'html', 'xml', 'txt'],
      mode: 'current',
      modes: ['current'],
      original: false,
      isHeader: true,
      isFooter: true,
      isColgroup: true,
      useStyle: true,
      columnFilterMethod: ({ column }) => {
        if (
          ['checkbox', 'seq', 'radio '].includes(column.type || '') ||
          ['vxe-checkbox', 'vxe-seq', 'vxe-radio ', 'vxe-action'].includes(column.field || '') ||
          !column.field ||
          !column.visible
        ) {
          return false
        }
        return true
      }
    },
    editConfig: {
      trigger: 'click',
      mode: 'cell',
      showStatus: false,
      showUpdateStatus: false
    },
    checkboxConfig: {
      strict: true,
      reserve: false,
      highlight: true,
      range: false,
      trigger: 'cell'
    },
    radioConfig: {
      strict: false,
      reserve: false,
      highlight: true,
      trigger: 'cell'
    }
  },
  grid: {
    formConfig: {
      titleWidth: 80,
      titleAlign: 'right'
    },
    toolbarConfig: {
      custom: false,
      zoom: false,
      refresh: false,
      // refresh: {
      //   code: 'query'
      // },
      export: false,
      slots: {
        buttons: 'toolbar_buttons',
        tools: 'tools'
      }
      // tools: [{ toolRender: { name: 'ToolbarToolPrint' } }]
    },
    proxyConfig: {
      seq: true, // 启用动态序号代理，每一页的序号会根据当前页数变化
      sort: false, // 启用排序代理，当点击排序时会自动触发 query 行为
      filter: false, // 启用筛选代理，当点击筛选时会自动触发 query 行为
      form: true, // 启用表单代理，当点击表单提交按钮时会自动触发 reload 行为
      autoLoad: true,
      message: true,
      props: {
        // list: 'response_data',
        // 对应响应结果 Promise<{ result: [], page: { total: 100 } }>
        result: 'data', // 配置响应结果列表字段
        total: 'total' // 配置响应结果总页数字段
      }
    }
  },
  pager: {
    size: null,
    autoHidden: false,
    perfect: true,
    pageSize: 100,
    pagerCount: 7,
    pageSizes: [20, 50, 100, 200, 500],
    layouts: ['PrevJump', 'PrevPage', 'Jump', 'PageCount', 'NextPage', 'NextJump', 'Sizes', 'Total']
  },
  toolbar: {
    custom: true,
    zoom: true,
    refresh: {
      code: 'query'
    },
    export: false
  },
  form: {
    titleWidth: 100,
    titleAlign: 'right',
    // padding: false,
    validConfig: {
      theme: 'normal'
    }
  },
  select: {
    transfer: true
  },
  modal: {
    transfer: true
  }
}

function getVxeGlobalConfig(isOriginal?: boolean): VxeGlobalConfig {
  if (isOriginal) {
    return XEUtils.clone(vxeGlobalConfig, true)
  }
  return VxeTable.getConfig()
}

VxeUI.setConfig(getVxeGlobalConfig(true))

function lazyVxeUI(app: App) {
  // app.use(VxeAlert);
  // app.use(VxeAnchor);
  // app.use(VxeAnchorLink);
  // app.use(VxeAvatar);
  // app.use(VxeBadge);
  // app.use(VxeBreadcrumb);
  // app.use(VxeBreadcrumbItem);
  app.use(VxeButton)
  // app.use(VxeButtonGroup)
  // app.use(VxeCalendar);
  // app.use(VxeCard);
  // app.use(VxeCarousel);
  // app.use(VxeCarouselItem);
  // app.use(VxeCheckbox)
  // app.use(VxeCheckboxGroup)
  // app.use(VxeCol);
  // app.use(VxeCollapse);
  // app.use(VxeCollapsePane);
  // app.use(VxeColorPicker);
  // app.use(VxeCountdown);
  // app.use(VxeDatePicker)
  // app.use(VxeDrawer);
  // app.use(VxeEmpty);
  // app.use(VxeForm)
  // app.use(VxeFormDesign);
  // app.use(VxeFormGather);
  // app.use(VxeFormGroup);
  // app.use(VxeFormItem)
  // app.use(VxeFormView);
  // app.use(VxeIcon)
  // app.use(VxeIconPicker);
  // app.use(VxeImage);
  // app.use(VxeImageGroup);
  // app.use(VxeImagePreview);
  // app.use(VxeInput)
  // app.use(VxeLayoutAside);
  // app.use(VxeLayoutBody);
  // app.use(VxeLayoutContainer);
  // app.use(VxeLayoutFooter);
  // app.use(VxeLayoutHeader);
  // app.use(VxeLink);
  // app.use(VxeListDesign);
  // app.use(VxeListView);
  app.use(VxeList)
  // app.use(VxeLoading);
  // app.use(VxeMenu);
  app.use(VxeModal)
  // app.use(VxeNoticeBar);
  app.use(VxeNumberInput)
  // app.use(VxeOptgroup);
  // app.use(VxeOption)
  app.use(VxePager)
  // app.use(VxePasswordInput);
  // app.use(VxePrintPageBreak);
  // app.use(VxePrint);
  // app.use(VxePulldown)
  app.use(VxeRadio)
  // app.use(VxeRadioButton);
  app.use(VxeRadioGroup)
  // app.use(VxeRate);
  // app.use(VxeResult);
  // app.use(VxeRow);
  // app.use(VxeSelect)
  // app.use(VxeSlider);
  // app.use(VxeSteps);
  // app.use(VxeSwitch)
  // app.use(VxeTabPane);
  // app.use(VxeTableSelect);
  // app.use(VxeTabs);
  // app.use(VxeTag);
  // app.use(VxeTextEllipsis);
  // app.use(VxeText);
  // app.use(VxeTextarea);
  // app.use(VxeTip)
  app.use(VxeTooltip)
  // app.use(VxeTree);
  // app.use(VxeTreeSelect)
  // app.use(VxeUpload);
  // app.use(VxeWatermark);
}

function lazyVxeTable(app: App) {
  // app.use(VxeTable);
  // app.use(VxeColumn);
  // app.use(VxeColgroup);
  // 使用basic-vxe-table
  // app.use(VxeGrid)
  app.use(VxeToolbar)
}

async function lazyVxePlugin() {
  const ExcelJS = await import('exceljs')
  VxeUI.use(VxeUIPluginRenderElement)
    .use(VXETablePluginExportXLSX, {
      ExcelJS
    })
    .use(VXETablePluginShortcutKey, {
      // 快捷键监听
      listener: {
        // 'Ctrl + F'(params, evnt) {
        //   console.log('Ctrl + F');
        // },
        // 'Ctrl + C'(params, evnt) {
        //   console.log('Ctrl + C');
        // },
        // 'Ctrl + V'(params, evnt) {
        //   console.log('Ctrl + V');
        // },
      },
      // 功能键设置
      setting: {
        // 'pager.prevPage': 'ArrowLeft',
        // 'pager.nextPage': 'ArrowRight', // 单个按键
        // 'pager.prevJump': 'Shift + W',
        // 'pager.nextJump': 'Shift + S', // 组合键
      }
    })
}

export { getVxeGlobalConfig, lazyVxeTable, lazyVxeUI, lazyVxePlugin }
